package vistas.ventanas;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import vistas.paneles.JSelectionList;

import com.toedter.calendar.JDateChooser;

import daos.AtletaDAO;
import daos.EntrenadorDAO;
import daos.EventoDAO;
import daos.MaterialDAO;
import entidades.Atleta;
import entidades.Entrenador;
import entidades.Evento;
import entidades.Material;

public class EditarEvento extends JDialog{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JTextField id, nombre, descripcion, lugar;
	private JSelectionList responsables;
	private JSelectionList asistentes;
	private JSelectionList materiales;
	private JButton editar, cancelar;
	private JDateChooser inicio, fin;
	private Evento evento;
	private EventoDAO eventoDAO;
	private AtletaDAO atletaDAO;
	private EntrenadorDAO entrenadorDAO;
	private MaterialDAO materialesDAO;
	private Integer FLAG;
	public static final int MODIFICAR = 3;
	public static final int ELIMINAR = 4;
	public static final int AGREGAR = 5;
	
	public EditarEvento(){
		setTitle("Agregar nuevo evento");
		instanciar_componentes();
		responsables = new JSelectionList(entrenadorDAO.obtenListaEntrenador(),new ArrayList<Entrenador>());
		asistentes = new JSelectionList(atletaDAO.obtenListaAtleta(),new ArrayList<Atleta>());
		materiales = new JSelectionList(materialesDAO.obtenListaMaterial(),new ArrayList<Material>());
		cargar_componentes();
		listeners();
		pack();
		setModal(true);
		setVisible(true);
	}
	
	public EditarEvento(Integer identificador, int flag){
		setTitle("Datos del evento");
		instanciar_componentes();
		FLAG = flag;
		cargar_valores(identificador);
		cargar_componentes();
		listeners();
		pack();
		
		setModal(true);
		setVisible(true);
	}
	
	private void instanciar_componentes(){
		FLAG = new Integer(AGREGAR);
		eventoDAO = new EventoDAO();
		atletaDAO = new AtletaDAO();
		materialesDAO = new MaterialDAO();
		entrenadorDAO = new EntrenadorDAO();
		JPanel panel = new JPanel();
		setContentPane(panel);
		id = new JTextField();
		configurar_componente(id, "Identificador");
		nombre = new JTextField();
		configurar_componente(nombre, "Nombre");
		descripcion = new JTextField();
		configurar_componente(descripcion, "Descripción");
		lugar = new JTextField();
		configurar_componente(lugar, "Lugar");
		inicio = new JDateChooser();
		configurar_componente(inicio, "Fecha de Inicio");
		fin = new JDateChooser();
		configurar_componente(fin, "Fecha culminación");
		editar = new JButton("Agregar");
		cancelar = new JButton("Cancelar");
		evento = new Evento();
		eventoDAO = new EventoDAO();
		
	}
	
private void cargar_valores(Integer identificador) {
		
		evento = eventoDAO.obtenEvento(identificador);
		id.setText(String.valueOf(evento.getId()));
		nombre.setText(evento.getNombre());
		descripcion.setText(evento.getDescripcion());
		lugar.setText(evento.getLugar());
		inicio.setDate(evento.getFechaInicio());
		fin.setDate(evento.getFechaFin());

		ArrayList<Entrenador> le = new ArrayList<Entrenador>(evento.getEncargados());
		responsables = new JSelectionList(entrenadorDAO.obtenListaEntrenador(),le);
		
		ArrayList<Atleta> la = new ArrayList<Atleta>(evento.getAtletasAsistentes());
		asistentes = new JSelectionList(atletaDAO.obtenListaAtleta(),la);
		
		ArrayList<Material> lm = new ArrayList<Material>(evento.getMateriales());
		materiales = new JSelectionList(materialesDAO.obtenListaMaterial(),lm);
		
		
		
		if (FLAG == MODIFICAR) {
			id.setEnabled(false);
			editar.setText("Modificar");
		}
		if (FLAG == ELIMINAR) {
			id.setEnabled(false);
			descripcion.setEnabled(false);
			nombre.setEnabled(false);
			lugar.setEnabled(false);
			inicio.setEnabled(false);
			fin.setEnabled(false);
			editar.setText("Eliminar");
		}
		
	}

	private void cargar_componentes() {
		if (FLAG != AGREGAR)
			add(id);
		add(descripcion);
		add(lugar);
		add(inicio);
		add(fin);
		add(editar);
		add(cancelar);
		add(responsables);
		add(asistentes);
		add(materiales);

		responsables.setBorder(BorderFactory.createTitledBorder("Entrenadores"));
		asistentes.setBorder(BorderFactory.createTitledBorder("Atletas"));
		materiales.setBorder(BorderFactory.createTitledBorder("Materiales"));
	}

	
	private void configurar_componente(JComponent tf, String s) {
		tf.setBorder(BorderFactory.createTitledBorder(s));
		tf.setPreferredSize(new Dimension(150, 40));
		if(tf.getClass() == JDateChooser.class){
			tf.setPreferredSize(new Dimension(150, 50));
		}	
	}
	
	private void listeners(){
		editar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					Evento evento = new Evento();
					evento.setNombre(nombre.getText());
					evento.setDescripcion(descripcion.getText());
					evento.setLugar(lugar.getText());
					evento.setFechaFin(new java.sql.Date(fin
							.getDate().getTime()));
					evento.setFechaInicio(new java.sql.Date(inicio
							.getDate().getTime()));
					List<Entrenador> ent = responsables.getChosen();
					evento.setEncargados(ent);
					
					List<Atleta> atl = asistentes.getChosen();
					evento.setAtletasAsistentes(atl);
					
					List<Material> mat = materiales.getChosen();
					evento.setMateriales(mat);
					if(inicio.getDate().after( fin.getDate())){
						JOptionPane
						.showMessageDialog(null,
								"La fecha de inicio del evento debe ser antes que la de culminación");
						return;
					}

					if (FLAG == AGREGAR)
						eventoDAO.guardaEvento(evento);
					if (FLAG == MODIFICAR) {
						evento.setId(Integer.parseInt(id.getText()));
						eventoDAO.actualizaEvento(evento);
					}
					if (FLAG == ELIMINAR) {
						evento.setId(Integer.parseInt(id.getText()));
						eventoDAO.eliminaEvento(evento);
					}
					dispose();

				} catch (Exception e2) {
					
					JOptionPane
					.showMessageDialog(null,
							"El evento ya existe o faltan campos por llenar \n Verifique los datos");
				}

			}
		});

		cancelar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();

			}
		});

	}
}

